import os
import random
import numpy as np
import cv2

# 创建dir
def createdir(*args):
    for item in args:
        #判断括号里的文件是否存在的意思，括号内的可以是文件路径。
        if not os.path.exists(item):
            #创建目录
            os.makedirs(item)
#图片大小
IMGSIZE = 64

#获取尺寸以使图像成为正方形
def getpaddingSize(shape):
    h, w = shape
    longest = max(h, w)
    result = (np.array([longest]*4, int) - np.array([h, h, w, w], int)) // 2
    #矩阵转化为列表
    return result.tolist()
#图片处理
def dealwithimage(img, h=64, w=64):
    #获取图片信息
    top, bottom, left, right = getpaddingSize(img.shape[0:2])
    #给图片添加边框
    img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
    #图像缩放
    img = cv2.resize(img, (h, w))
    return img

def relight(imgsrc, alpha=1, bias=0):
    #转换数据类型
    imgsrc = imgsrc.astype(float)
    imgsrc = imgsrc * alpha + bias
    imgsrc[imgsrc < 0] = 0
    imgsrc[imgsrc > 255] = 255
    imgsrc = imgsrc.astype(np.uint8)
    return imgsrc

#获得人脸框图
def getfacefromcamera(outdir):
    #创建存储图片的文件夹
    createdir(outdir)
    #打开摄像头
    camera = cv2.VideoCapture(0)
    #加载本地人脸分类器
    haar = cv2.CascadeClassifier('G:\TensorFlow\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml')
    n = 1
    while 1:
        if (n <= 200):
            print('It`s processing %s image.' % n)
            # 读帧
            success, img = camera.read()

            gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            #检测出人脸保存人脸数据
            faces = haar.detectMultiScale(gray_img, 1.3, 5)

            for f_x, f_y, f_w, f_h in faces:
                face = img[f_y:f_y+f_h, f_x:f_x+f_w]
                #脸部图片的缩放
                face = cv2.resize(face, (IMGSIZE, IMGSIZE))
                #解决训练所用的脸部图片
                #random.uniform随机生成一个实数x随机数的最小值，包含该值。y随机数的最大值，不包含该值。
                #random.randint随机生成一个数x随机数的最小值，包含该值。y随机数的最大值，含该值。
                face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
                #保存图片os.path.join（）将多个路径组合后返回
                cv2.imwrite(os.path.join(outdir, name+str(n)+'.jpg'), face)

                cv2.putText(img, '看这里', (f_x, f_y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)  #显示名字
                #画出矩行
                img = cv2.rectangle(img, (f_x, f_y), (f_x + f_w, f_y + f_h), (255, 0, 0), 2)
                n+=1
            cv2.imshow('img', img)
            key = cv2.waitKey(30) & 0xff
            if key == 27:
                break
        else:
            break
    camera.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    name = input('please input yourename: ')
    getfacefromcamera(os.path.join('./image/trainfaces', name))

